<?php
/**
 * 16、设计模式学习-迭代器模式
 * 学生迭代控制器
 * 2019年12月28日10:56:43
 */
namespace Application\Controller;

use Application\Common\Iterator\StudentArray as StudentArray;
use Application\Common\Iterator\StudentIterator as StudentIterator;


class StudentIteratorController extends BaseController
{
    public function index()
    {
        // 所有学生
        $students = array(
            '张三',
            '李四',
            '王五',
        );
        echo '当前学生的数组为：';
        export($students);
        echo '<hr />';

        // 利用 foreach 数组实现
        echo '1. 利用 foreach 数组实现：<br />';
        $students_1 = new StudentArray();
        // 增加数据
        foreach($students as $k => $v){
            $students_1 -> students[] = $v;
        }
        // // count 数组长度
        // echo '1-1. 当前对象属性的长度为：'.count($students_1 -> students).'<br />';
        // // current 获取数组的当前值
        // echo '1-2. 当前值为：'.current($students_1 -> students).'<br />';
        // // key 获取数组的当前键
        // echo '1-3. 当前键为：'.key($students_1 -> students).'<br />';
        // // next 将数组的内部指针移动到下一个单元
        // echo '1-4. 将数组的内部指针移动到下一个单元<br />';
        // next($students_1 -> students);
        // echo '在移动了指针以后，当前值为：'.current($students_1 -> students).'<br />';
        // // reset 重置指针
        // reset($students_1 -> students);
        // // end 将数组的内部指针指向最后一个单元
        // echo '1-5. 将数组的内部指针指向最后一个单元<br />';
        // end($students_1 -> students);
        // echo '在指向了最后一个单元后，当前值为：'.current($students_1 -> students).'<br />';
        // reset($students_1 -> students);
        // echo '1-6. 迭代<br />';
        foreach($students_1 -> students as $k => $v){
            echo "当前键为：{$k}，当前值为：{$v}<br />";
        }
        // 总结：思路为把对象的属性转化为数组，运用简单，但不能隐藏数据

        echo '<hr />';
        echo '2. 利用 实现 SPL 迭代器接口来实现：<br />';
        $students_2 = new StudentIterator();
        foreach($students as $k => $v){
            $students_2 -> add($v);
        }
        // 迭代
        foreach($students_2 as $k => $v){
            echo "当前键为：{$k}，当前值为：{$v}<br />";
        }
        // 总结：实现 SPL Iterator 接口，可以隐藏数据，可以实现更加复杂的业务逻辑
    }
}
